package org.dromara.common.wukong.service;

import com.alibaba.fastjson2.JSONArray;
import org.dromara.common.wukong.dto.*;

import java.io.IOException;

/**
 * 频道业务
 * @Author: Stars
 * @Date: 2025/3/10 21:03
 */
public interface ChannelService {

    /**
     * 创建或更新频道
     * <p>
     *     创建一个频道，如果系统中存在则更新（个人与个人聊天不需要创建频道，系统将自动创建）
     * </p>
     */
    void createOrUpdateChannel(ChannelCreateOrUpdateDTO channelCreateOrUpdate) throws IOException;

    /**
     * 删除频道
     */
    void delete(ChannelDeleteDTO channelDelete) throws IOException;

    /**
     * 向已存在的频道内添加订阅者
     */
    void addSubscribers(ChannelSubscriberAddDTO channelSubscriberAdd) throws IOException;

    /**
     * 向已存在的频道内移除订阅者
     */
    void removeSubscribers(ChannelSubscriberRemoveDTO channelSubscriberRemove) throws IOException;

    /**
     * 将用户添加到频道黑名单内
     */
    void addToBlacklist(ChannelBlacklistAddDTO channelBlacklistAdd) throws IOException;

    /**
     * 将用户从频道黑名单内移除
     */
    void removeFromBlacklist(ChannelBlacklistRemoveDTO channelBlacklistRemove) throws IOException;

    /**
     * 设置频道黑名单（覆盖原来的黑名单数据）
     */
    void setBlacklist(ChannelBlacklistSetDTO channelBlacklistSet) throws IOException;

    /**
     * 向频道添加白名单
     */
    void addToWhitelist(ChannelWhitelistAddDTO channelWhitelistAdd) throws IOException;

    /**
     * 将用户从频道白名单内移除
     */
    void removeFromWhitelist(ChannelWhitelistRemoveDTO channelWhitelistRemove) throws IOException;

    /**
     * 设置频道白名单（覆盖原来的白名单数据）
     */
    void setWhitelist(ChannelWhitelistSetDTO channelWhitelistSet) throws IOException;

    /**
     * 同步用户离线信息
     *
     * @param senderId        发送者
     * @param receiverId      接收者
     * @param startMessageSeq 开始消息序列号
     * @param limit
     */
    JSONArray syncOfflineMessage(String senderId, String receiverId, Long startMessageSeq, Long limit) throws IOException;


    /**
     * 查询最新的limit条数据
     * <p>
     *     刚进入聊天页面查询聊天记录时使用
     * </p>
     * @param senderId        发送者
     * @param receiverId      接收者
     * @param startMessageSeq 开始消息序列号
     * @param limit
     */
    JSONArray syncOfflineGroupRecentlyMessage(String senderId, String receiverId,Long startMessageSeq, Long limit) throws IOException;

    /**
     * 查询小于 startMessageSeq 的limit条数据
     * <p>
     *     一般在聊天页面往上滑动加载历史数据时使用
     * </p>
     * @param senderId         发送者
     * @param receiverId 接受者
     * @param startMessageSeq 开始消息序列号
     * @param endMessageSeq 结束消息序列号
     * @param limit 限制条数
     * @return
     * @throws IOException
     */
    JSONArray syncGroupHistoryMessage(String senderId, String receiverId, Long startMessageSeq,Long endMessageSeq, Long limit) throws IOException;
}
